package xiaohu;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import java.util.ArrayList;
import java.util.List;




public class ExcelMerger {
    // 假设你有两个Excel文件，分别名为X1.xlsx和X2.xlsx
    private static String filePath1 = "E:\\java\\x1.xlsx";
    private static String filePath2 = "E:\\java\\x2.xlsx";
    // 用于存储从X1.xlsx和X2.xlsx读取的数据
    private static List<DataModel> dataFromX1 = new ArrayList<>();
    private static List<DataModel> dataFromX2 = new ArrayList<>();
    public static void main(String[] args) {
        readX1();
    }


    // 读取X1.xlsx的方法
    private static void readX1() {
        // 使用EasyExcel读取X1.xlsx并填充dataFromX1
        EasyExcel.read(filePath1, DataModel.class, new AnalysisEventListener<DataModel>() {

            //每解析一行调用一次
            @Override
            public void invoke(DataModel dataModel, AnalysisContext analysisContext) {
                System.out.println("解析到一条数据: " + dataModel);
            }

            //全部解析完才会调用
            @Override
            public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                System.out.println("读取完毕");
            }
        }).sheet().doRead();
    }

    // 读取X2.xlsx的方法
    private void readX2() {
        // 使用EasyExcel读取X2.xlsx并填充dataFromX2
        // 这里是伪代码，你需要根据自己的需求来实现
        // ...
    }

    // 将数据写入X3.xlsx的方法
    private void writeToX3() {
        List<DataModel> allData = new ArrayList<>(dataFromX1);
        allData.addAll(dataFromX2);

        // 使用EasyExcel写入X3.xlsx
        String outputFilePath = "path/to/X3.xlsx";
        EasyExcel.write(outputFilePath, DataModel.class)
                .sheet("Sheet3")
                .doWrite(allData);
    }

/*    public static void main(String[] args) throws InterruptedException {
        ExcelMerger merger = new ExcelMerger();

        // 创建ExecutorService来并行读取数据
        ExecutorService executor = Executors.newFixedThreadPool(2);

*//*
        // 使用Runnable接口创建一个读取任务、与下面的方法引用效果相同
        executor.submit(new Runnable() {
            @Override
            public void run() {
                merger.readX1();
            }
        });*//*

        // 提交读取任务到ExecutorService
        executor.submit(merger::readX1);
        executor.submit(merger::readX2);

        // 等待所有读取任务完成
        executor.shutdown();
        executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); // 或者使用其他合适的超时时间

        // 现在所有数据都已经被读取到dataFromX1和dataFromX2中
        // 但我们不需要定时写入，因为读取是并行的，写入可以立即进行

        // 如果你确实想要每隔两秒写入一次（尽管这在大多数情况下不是必需的），
        // 你可以使用ScheduledExecutorService，但请注意，这可能会导致重复写入相同的数据
        ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();

        // 安排写入任务首次执行并每隔两秒重复执行
        // 但由于读取已经完成，并且我们只想写入一次，所以这里只需要执行一次
        // 如果需要模拟数据更新，你可能需要在某个地方更新dataFromX1和dataFromX2，并在需要时重新安排写入
        scheduler.scheduleAtFixedRate(() -> {
            merger.writeToX3(); // 注意：这可能会导致重复写入相同的数据
            // 如果你想要避免重复写入，你可能需要添加一些逻辑来检查数据是否已更改
        }, 0, 2, TimeUnit.SECONDS);

        // 注意：在实际应用中，你可能需要在程序退出时关闭scheduler
        // 使用Runtime.getRuntime().addShutdownHook(...)可以添加一个关闭scheduler的钩子
    }*/
}
